Host computers send input/output (I/O) requests to storage arrays to perform reads, writes, and maintenance. The storage arrays typically process the requests in a fraction of a second. In some instances, numerous hosts direct large numbers of requests toward a single storage array. If the array is not able to immediately process the requests, then the requests are queued.
I/O requests at a storage device are processed according to predefined priorities. Historically, Small Computer System Interface (SCSI) storage devices had limited information for use in prioritizing I/Os. This information included standard Initiator-Target-LUN (ITL) nexus information defined by SCSI and task control information. Effectively, SCSI protocol forced all I/Os through a particular ITL nexus and processed the I/Os with the same priority. Thus, all I/Os were processed with a same priority and quality of service (QoS). ITL nexus information is insufficient to identify I/Os according to application relevant priority or other QoS information.
In some storage systems, incoming I/Os include a unique initiator ID. This initiator ID identifies the host or a port on the host, but does not identify the application. Since a single host can simultaneously execute numerous applications, several applications can send I/Os through a same host port and receive identical initiator IDs. Further, in virtual environments, applications can move between various ports. As such, the initiator ID alone will not provide sufficient information of the application that generated the I/O. Thus, assigning priorities to specific initiator IDs would not result in knowing which priorities are being assigned to which applications.